'''oop面向对象编程思想'''
# 什么对象:某一种类型的一个个体，实例，郭德纲，我正在使用的电脑，pyhton
# 什么是类:某一类事物，桌子，电脑...
# 面向对象:软件编程的本质是将现实世界的需求抽象出来，根据抽象的导向不同，就分支出不同的编程思想，面向对象就是以对象的抽象
#         为导向，在需求中找对象，然后根据找出的对象抽象(创建)出一种类型,有了类型之后，就可以根据业务的需求来创建对象了，



'''类的定义语法'''
# class 类名（继承列表）
#     "类的文档字符串"
#     实例方法 method
#     类变量
#     类的方法
#     静态方法
# 作用：当作模板来创建对象
#      用来描述该类的对象具备的行为和属性

# 对象的创建：变量 = 类名



'''对象说明'''
# 每一个对象有自己的作用域和名字空间，还可以为每一个对象添加实例变量
# 实例可以调用类方法和实例方法
# 实例可以访问类变量和实例变量



'''创建一个类，用这个类来创建一个对象，并基于业务的需求调用相关的属性或者方法'''
# 在定义类的时候，类里面有哪些东西，是根据在需求中找出的对象都具备的功能。
# 面向对象的本质:在需求中找对象，根据找出对象定义出类型。



'''实例方法和实例变量（属性）'''
# class 类名（）:
#     def 实例方法名(self,参数1，参数2...):
#         "实例方法的文档字符串"
#         实例方法体
# 作用：描述了所有对象都具备的行为
# 调用：对象.实例方法名（参数1，参数2...）或者
#      类名.实例方法名（实例，参数1，参数2）

# class Dog:
#     def eat(self,food):#self表示当前对象
#         "这是Dog的实例方法，表示吃东西的功能"
#         print("小狗正在吃",food)
#
#     def sleep(self,hour):
#         "这是Dog的实例方法，表示睡觉的功能"
#         print("小狗睡了",hour,"小时")
#
#     def play(self,obj):
#         "这是Dog的实例方法，表示玩的功能"
#         print("小狗正在玩",obj)
#
# dog1 = Dog()
# dog2 = Dog()
# dog1.eat("肉")
# dog2.play("玩具")
#
# dog1.color = "白色"
# print(dog1.color)#为dog1对象创建一个属性
# dog1.color = "黑色"
# print(dog1.color)#重新赋值




'''实例变量（属性）'''
# 作用：每一个实例都具备的变量
# 调用：对象.属性名
# 注意事项：
# 首次为对象的属性进行赋值，就是创建此对象
# 以后再次赋值就是修改对象的值


# class Student:
#     def set_info(self, name, age=0):
#             self.name = name
#             self.age = age
#
#     def show_info(self):
#         print(self.name, self.age)
#
# student1 = Student()
# student1.set_info("张三",22)
# student2 = Student()
# student2.set_info("李四")
# student1.show_info()
# student2.show_info()
#
# del student2



'''初始化方法'''
# 作用：创建对象是会自动调用，一般作为对象的属性初始化

# def __init__(self,参数列表):
#     pass

# 注意：
# 方法的名字必须是__init__
# 形参中的第一个必须是self（也可以是别的单词）
# 创建对象是的实参列表和形参列表匹配
# 初始化方法没有返回，只能返回None

# class Dog():
#     #形参用来接收创建对象时传来的实参
#     #self.表示给对象创建属性
#     def __init__(self,kind,color,age):
#         self.kind = kind
#         self.color = color
#         self.age = age
#
#     def eat(self,food):
#         print(self.kind,"种类",self.color,"颜色的小狗，正在吃",food)
#
# dog1 = Dog("萨摩耶","白色",3)
# dog1.eat("狗粮")

# class Student:
#     def __init__(self,id,name,score):
#         self.id = id
#         self.name = name
#         self.score = score
#
#     def show_info(self):
#         print(self.id,self.name,self.score)
#
#     def set_score(self,score):
#         self.score = score
#
# s1 = Student(2022030205,"张三",98)
# s1.show_info()



'''析构方法'''
# def __del__(self):
#     pass

# class Student:
#     def __init__(self,id,name,score):
#         print(self,"对象被创建")
#         self.id = id
#         self.name = name
#         self.score = score
#     def __del__(self):
#         print(self,"对象被销毁了")
#
# s1 = Student(2022030205,"张三",98)


# class Human():
#     def __init__(self,name,age,money):
#         self.name = name
#         self.age = age
#         self.money = money
#
#     def teach(self,other,skill):
#         print(self.name,"教",other.name,"学",skill)
#
#     def work(self,hours):
#         self.money += hours * 100
#         print(self.name,"工作了",hours,"小时，赚了",hours*100,"元")
#
#     def borrow (self,other,borrow_money):
#         if self.money >= borrow_money:
#             self.money -=borrow_money
#             other.money += borrow_money
#             print(self.name,"借了",borrow_money,"元给",other.name)
#         else:
#             print("不借")
#
#     def show(self):
#         print(self.name,"有",self.money,"元")
#
# person1 = Human("饶加蓉",22,10000)
# person2 = Human("罗凯",18,0)
# person1.show()
# person2.show()
# person1.teach(person2,"Python")
# person1.work(5)
# person1.show()
# person1.borrow(person2,1)
# person1.show()
# person2.show()



'''isinstance()'''
# 语法：isinstance(obj,class)或者 is



'''类变量，一般用来记录'''
# class Car():
#     #直接在类里面定义变量，是类级别的
#     count = 0
#     #初始化方法
#     def __init__(self):
#         # car.__class__.count直接访问的是类变量:Car.count
#         self.__class__.count = self.count + 1
#     def __del__(self):
#         pass
#
# print(Car.count)#通过类直接访问
# car = Car()
# print(car.count)#通过对象访问
# print(car.__class__.count)



'''类的文档字符串'''
# 类中没有赋值给任何变量的字符串，会绑定在类的__doc__属性中



'''类的__slots__属性（列表）'''
# __slots__是类的一个属性，是一个列表，限定了这个类的实例只能有哪些属性
# 通常是为了用户写错属性名
# 如果类中定义了__slots__，那么该对象就不具备__dict__属性



'''类方法@classmothod'''
# 类方法是描述该类具备的行为，不属于某一对象，所有的对象可以访问
# 要求：
# 需要在方法前面加上装饰器@classmethod
# 类方式最少需要一个形参，这个形参绑定的是类，一般写作cls
# 类和该类的实例是否都可以访问？？？
# 类方法能不能访问这个类的对象的属性？？？